智能网联车辆在车联网的买赞应用上,一般是播放以智能传感、物联网、量双拽拽24小时自助业务下单GIS技术为基础,击平结合大数据、买赞人工智能技术,播放通过OT(OperationTechnology)和IT(InformationTechnology)融合的量双形式,实现智能汽车的击平辅助驾驶、状态监控、买赞远程管理、播放数据剖析及决策等功能。量双同时,击平通过对云端大数据的买赞实时剖析,还可以对营运汽车实现行程报案、播放路径规划、量双电子栏杆、订单跟踪等企业级功能。 车联网云端大数据最重要的工作之一,是处理海量的GPS轨迹数据。GPS轨迹数据本质上是带时间标签的时序数据(timeseriesdata),市面上好多时序数据库都才能满足时序数据的简单储存和简单查询需求。但在完整的车联网应用场景中,绝大部分时序数据库是难以直接输出最终业务所需结果的,也未能将时序数据与业务数据进行关联查询。 因而一般做法是在时序数据库的基础上,配合复杂的系统构架来支撑业务需求。比如,当我们想要将GPS轨迹跟汽车辨识码、订单关联时,须要将GPS轨迹数据提取到应用端,拽拽24小时自助业务下单使用关系数据库和编程工具进行二次处理。这些方法似乎能解决业务查询问题,并且在一定程度上降低了系统的复杂性,而且在性能、开发难度、数据挖掘等方面深受构架限制。 车联网一站式大数据处理平台是一个综合性系统,用于搜集、存储、处理和剖析汽车形成的庞大数据量。它提供了全面的解决方案,就能以更智能、高效的方法管理整个车联网生态系统。 这么一个优异的高性能车联网大数据平台须要具备什么能力呢? 强悍的数据对接能力是车联网大数据平台的核心要素之一。该平台需具备多合同写入、乱序数据写入等先进技术播放量双击平台,以实现端到端的无缝数据写入。先进的数据对接能力致使车联网大数据平台在数据流入时无需经过冗长的二次处理,直接将数据安全、高效地入库储存。这除了增强了数据写入的效率,还确保了数据质量,为后续的数据剖析和挖掘奠定基础。 平台才能集中管理汽车各种类型的数据,如状态、位置、驾驶行为和传感信息等,使数据更便于访问和监控。通过支持单模数据储存,平台极大地简化了数据的访问和监控过程。无论是进行实时监控、历史回溯还是深度剖析,用户可以轻松地获取所需的数据。据悉,平台还提供了灵活而强悍的数据检索工具,使用户才能迅速定位并提取感兴趣的信息,进一步提升了数据的可用性和实用性。 通过高性能的流式估算,平台才能处理大规模、高密度的实时数据流,确保信息的即时性和精准性。低延时使系统才能实现实时响应,有效提高了监控和管理的效能。同时,高吞吐的流式估算能力才能轻松处理多源、高频的数据输入,满足车联网系统对大规模数据处理的需求,为实时监控汽车状态、及时跟进汽车的实时情况和驾驶员行为提供底层构架支撑。 平台具备强悍的数据剖析能力,囊括完备的数据剖析工具、卓越的海量数据处理能力以及方便的可视化工具。这一综合性能有助于平台处理庞大的汽车数据集,从预测性维护、驾驶习惯、燃油效率等多个方面为用户提供深刻洞察。这些深度的数据剖析除了才能提高汽车的维护效率,还有助于制订更智能、高效的营运策略,因而全面提高整个车联网系统的性能和管理水平。 每秒1.8亿写入、单车7000个测点…… 一个真实的车联网大数据平台应用场景案例: 某新能源车企的数据写入与确诊非常复杂,面临两大痛点与挑战:一方面是每秒1.8亿测点大数据量的写入,在保障大数据量的写入下,须要满足查询性能要求;另一方面,在汽车确诊场景中,自行车测点达7000,须要大宽表储存支持,并对汽车确诊场景的海量数据进行估算与剖析。 首先,在数据写入及查询系统方面,这个系统须要处理来自数以十万计汽车的海量实时数据。每辆车定期形成并上传数据,每条数据包含着多达7000个测点的信息,预计每秒数据量将达到1.5G。这意味着这一系统必须具备高效的数据写入和查询能力,以确保数据的实时性和可用性。 其次,在汽车确诊场景中,应用系统负责对部份汽车进行确诊,并对这种汽车的三天历史数据进行剖析。每辆车都拥有7000个测点,这种测点记录着汽车的各类运行参数和性能指标。这样的数据量和复杂性要求强悍的数据处理和剖析能力,便于及时发觉汽车的故障和问题,并进行有效确诊和处理。 经过前期督查与综合审视,该车企选购了DB-Engines上国外排行第一的时序数据库DolphinDB进行测试。经过测试后,DolphinDB为该车企提供了如下特点: 满足每秒1.8亿测点的写入,且资源使用率较低播放量双击平台,cpu、内存都稳定在40%左右,保证了系统的稳定性和可靠性。 写入过程中,单点查询平均历时在100ms以内,为用户提供了快速响应的数据查询体验。 对于汽车确诊系统,DolphinDB能满足7000项指标的大宽表模型,无需分库分表,进一步简化了系统构架,增强了数据管理的效率。 历史数据的批量导出性能可达2.2亿点每秒。 提供1600+外置函数,提供强悍的数据剖析与估算能力。 提供实时估算能力,才能满足边沿端估算需求,可实现云边端构架布署,进一步提升了系统的可扩充性和适应性。(向下降至文末,加群了解完整解决方案) 基于DolphinDB的车联网大数据处理构架: 接出来我们给你们详尽介绍上文提及的车联网大数据处理构架,并提供了轻量化版本(完整脚本代码在附件中),你们可以用10分钟左右快速验证。 在这一构架中,时间信息、车牌、经经度、速度等多数据源的海量数据从采集层步入DolphinDB大数据平台,注入流数据表中。DolphinDB通过订阅流数据表,并与订单业务、车辆配置等数据进行关联查询,实现剖析与检测预警。输出的结果步入应用层,对接业务系统、消息中间件,或通过多种插口进行可视化展示。构架图如下所示: 基于DolphinDB的车联网大数据处理构架图 作为一个基于时序数据库管理系统,支持数据剖析、流估算的低延时平台,DolphinDB具有轻量化、一站式的特性,除了可以高速储存海量结构化数据,能够在库内直接进行复杂估算,外置的高性能流数据处理框架满足了实时流估算的需求,且脚本语言对标准SQL高度兼容,简单易上手。 使用这一构架可以实现海量轨迹数据的储存,汽车、订单的关联聚合查询,以及结果直接输出的完整流程。下边我们给出了8个查询案例场景,完整的脚本代码在附件中,任何开发人员都可以花10分钟左右的时间进行复现。 以场景7为例,将轨迹表(8.6亿)和订单表(100w)进行关联,返回某个配送订单的全部汽车运行轨迹,历时在112微秒左右: 场景8中,将某个订单的数据,按60倍速持续写入一个新表中,读取新表数据并输出到GIS系统的地图中,就可以十分便捷地实现某个订单汽车配送轨迹的实时播放,轻松回放行驶路径,用于异常排查。 SQL句子及参考历时 序号场景历时SQL句子 统计汽车经纬数据总量 1ms selectcount(*)fromdrives 按牌照+时间,查询汽车经纬数据 4ms select*fromdriveswherets=2022.07.0122:10:10.000,code=”浙A100207” 按牌照,统计数据总量 5ms selectcount(*)fromdriveswherecode=”浙A100207” 按牌照,查看汽车与总部距离 3ms selectts,code,string(long(distance(poi,point(lng,lat)))/1000)+"km"asdistancefromdriveswherets=2022.07.0122:10:10.000,code="浙A105207" 按牌照,查询三天的所有数据 3ms select*fromdriveswherecode="浙A165207"andtsbetween2023.01.0100:00:00.000:2023.01.0123:59:59.999 按牌照按每小时统计平均时速 12ms selectavg(velocity)fromdriveswherecode="浙A165207"groupbybar(ts,1H) 按订单ID,查询该订单所有路径 112ms //定义储存过程orderQuery orderQuery(1000006) 以60倍速回放某订单的汽车行驶轨迹 replay函数 10分钟轻松验证(Windows版) 步骤任务预计历时操作描述 布署DolphinDB大数据环境 1分钟 下载DolphinDB,并解压(免安装) 运行 1秒 双击dolphindb.exe文件,开启实例 运行开发环境 10秒 打开:8848,网页上可执行SQL等脚本 模拟生成8.64亿数据 8分钟 复制《data.txt》脚本,执行。 (注意,此处模拟的是仿真数据,即每一条数据都是单独生成的,而不是简单地把一份数据重复复制。) 验证查询性能 3分钟 复制《query.txt》脚本,依次执行,观察历时 注:以上脚本可在附表中查找获取 安装布署 1.下载官网社区最新版,建议2.00.9及以上版本。 传送门: 2.windows解压路径,不能有空格,防止安装到ProgramFiles路径下。 官网教程:standalone_server.md·dolphindb/Tutorials_CN-Gitee 3.本次测试使用免费的社区版,企业版license可申请免费试用。 获取方法:dolphindb.cn 4.安装及测试过程中,有任何问题,可添加小助手陌陌(dolphindb1)咨询。 欢迎你们动手尝试,一上去验证一下吧! 想要了解更多物联网行业资讯与方案?动手扫描下方二维码,即可加入物联网行业交流群并获得电力、能源、车联网等行业解决方案资料,捕捉行业热点讯息,与近百位同行交流心得~ 关注公众号DolphinDB物联网了解工业制造、智能运维、能源电力等更多物联网场景解决方案! DolphinDB是一款拥有自主知识产权的国产自研数据库软件,支持主流国产操作系统和芯片。目前已广泛应用于众多行业和场景,包括车联网、电力、能源、化工、工业制造、智慧煤矿等行业的数据储存、分析、设备监控预警场景,以及工行、券商、公募基金、私募基金、交易所等金融机构的投研、交易和风控场景。 附表 数据集表描述表名数据量 汽车信息表 t_car 10万 订单信息表 t_order 100万 GPS轨迹表 t_drive 8.64亿 环境配置项目参数 操作系统 DELLLatitude5420电脑笔记本windows11(22621.521) CPU 11thGenIntel(R)Core(TM)i5-1145G7@2.60GHz1.50GHz 显存 16G c盘 SSD512G 服务端 DolphinDB2.00.9 验证说明 1.统计历时使用timer函数,即排除网路传输和序列化影响,仅统计服务端全部数据处理完成的时间。 2.性能受c盘IO、CPU、网络等系统资源的影响,如测试环境不同,表格中的性能实测数据可能会有差别。 3.web端的交互编程执行方法,可以框选单条脚本,按Ctrl-E执行。也可以全选,按Ctrl-E执行。 4.模拟汽车轨迹写入的性能接近200万条/秒(1000万点/秒),可以作为真实数据写入性能的参考(排除合同联接、网络传输、序列化等历时)。 5.性能测试优先保障性能,配置文件dolphindb.cfg中可以限制资源(核数、内存等)。 《data.txt》:建库建表,模拟数据生成 //步骤一:登录 login(`admin,`123456)
//步骤二:建库、建表 //1.车辆信息表:t_car if(existsDatabase("dfs://t_car")){ dropDatabase("dfs://t_car")} create database "dfs://t_car" partitioned by VALUE([`code]) create table "dfs://t_car"."car" ( code SYMBOL, //车牌 model SYMBOL, //型号 emissions SYMBOL, //排量 brand SYMBOL //品牌 ) //2.配送订单表:t_order if(existsDatabase("dfs://t_order")){ dropDatabase("dfs://t_order")} create database "dfs://t_order" partitioned by VALUE([date(now())]), engine="TSDB" create table "dfs://t_order"."order" ( orderid LONG, //订单号 ts TIMESTAMP, //下单时间 btime TIMESTAMP, //配送起始时间 etime TIMESTAMP, //配送截止时间 code SYMBOL, //车牌 blng DOUBLE, //起始经度 blat DOUBLE, //起始纬度 elng DOUBLE, //目的地经度 elat DOUBLE //目的地纬度 ) partitioned by ts sortColumns=[`code,`ts], sortKeyMappingFunction=[hashBucket{ ,50}]
//3.车辆行驶路径表:dfs_drive if(existsDatabase("dfs://dfs_drive")){ dropDatabase("dfs://dfs_drive")} create database "dfs://dfs_drive" partitioned by VALUE([date(now())]),HASH([SYMBOL,60]),engine="TSDB" create table "dfs://dfs_drive"."drive" ( ts TIMESTAMP, //时间戳 code SYMBOL, //车牌 lng DOUBLE, //经度 lat DOUBLE, //纬度 velocity INT, //速度 altitude INT, //海拔 direction INT //方向 ) partitioned by ts,code sortColumns=[`code,`ts], sortKeyMappingFunction=[hashBucket{ ,50}]
//步骤三:模拟写入仿真数据 //写入车辆信息表:t_car(1万条) n=100000 code=100001..200000 //产生序列数据 code="浙A"+string(code) model=rand(`搅拌车`泵车`砂石车,n) //rand随机函数,用于产生数量为 n 的向量值 emissions=string(rand(5..10,n))+`升 brand=rand(`SANY`ZOOMLION`XCMG`LOXA`FANGYUAN`RJST,n) t=table(code,model,emissions,brand) t_car=loadTable("dfs://t_car",`car) t_car.append!(t)
select count(*) from t_car //数据检查 select top 10 * from t_car
//写入订单信息表:t_order(100万条) n=1000000 orderid=1000001..2000000 //产生序列数据 ts=take(2023.01.01..2023.01.10,n) //产生10天的订单 ts=sort(ts) //向量结构排序:10w条1月1日+10w条1月2日...+10w条1月10日 codes=select code from loadTable("dfs://t_car",`car) //获取1万车牌号码 code=take(codes.code,n) //向量结构:10w条车牌序列 x 10天=100w btime=temporalAdd(datetime(ts),rand(14400,n)+32400,"s") //开始配送时间:9点~13点随机 etime=temporalAdd(datetime(btime),rand(18000,n)+3600,"s") //配送时间:1小时~5小时随机 blng=103.60972+rand(1.0,n)-0.5 blat=30.81841+rand(1.0,n)-0.5 elng=103.60972+rand(1.0,n)-0.5 elat=30.81841+rand(1.0,n)-0.5 t=table(orderid,ts,btime,etime,code,blng,blat,elng,elat) t_order=loadTable("dfs://t_order",`order) t_order.append!(t)
select count(*) from t_order //数据检查 select top 10 * from t_order
//写入车辆轨迹数据,8.64亿/天 def write_data(){ for(ts in 2023.01.01..2023.01.01){ //将10w车牌拆分成50份,写入50次(可通过降低拆分数量,进一步提高速度。如内存不支持,可能会Out Of Memory) for(i in 1..50){ n=8640 j=(i-1)*2000 codes=select code from loadTable("dfs://t_car",`car) limit j , 2000*i time = datetime(ts)+ 10*(0..(n-1)) lng=103.60972+rand(1.0,n)-0.5 lat=30.81841+rand(1.0,n)-0.5 velocity=rand(100,n) altitude=rand(300,n) direction=rand(360,n) t=table(time as ts,lng,lat,velocity,altitude,direction) tt = cj(t,codes) //关联车牌和数据,每次写入量:2000*8640 reorderColumns!(tt,loadTable("dfs://dfs_drive",`drive).schema().colDefs.name) loadTable("dfs://dfs_drive",`drive).append!(tt) tt=NULL } } } submitJob(`write_data,`write_data,write_data) //后台执行写入操作
drives=loadTable("dfs://dfs_drive",`drive) //数据检查 select count(*) from drives
《query.txt》:性能测试 // 步骤四:数据准备工作 //检查作业状态(预计执行8分钟) select jobId,startTime as 开始时间,endTime as 结束时间,(endTime-startTime)/1000 as 执行秒数 from getRecentJobs(1)
//确定作业完成后,执行刷盘,LevelFile合并,清除缓存,确保性能测试的准确。 //因为短时间导入了大量数据,部分数据还在内存(CacheEngine)中,并逐步写入磁盘。为确保性能测试时,数据是从磁盘中读取,需要进行刷盘操作。 flushTSDBCache()
//LevelFile合并:优化历史数据的查询性能 chunkIds = exec chunkId from getChunksMeta() where type=1 for (x in chunkIds) { triggerTSDBCompaction(x) } //清除缓存,确保测试性能准确 clearAllCache()
// 步骤五:查询统计 //全量数据检查: /*1. 统计车辆经纬数据总数*/ drives=loadTable("dfs://dfs_drive",`drive) timer t=select count(*) from drives t select top 10 * from drives /*2. 按车牌+时间,查询车辆经纬数据*/ timer t=select * from drives where ts=2023.01.01 22:10:10.000 , code="浙A100207" t /*3 按车牌,统计数据总数*/ timer t=select count(*) from drives where code="浙A100207" t /*4 按车牌,查看车辆与总部距离*/ poi=point(104.102683,30.482596) //总部经纬度 timer t=select ts,code,string(long(distance(poi,point(lng, lat)))/1000)+`km as distance from drives where ts=2023.01.01 22:10:10.000 , code="浙A105207" t /*5 按车牌,查询一天的所有数据*/ timer t=select * from drives where code="浙A165207" and ts between 2023.01.01 00:00:00.000:2023.01.01 23:59:59.999 t /*6 按车牌查询每小时的平均车速 */ timer t=select avg(velocity) from drives where code="浙A165207" group by bar(ts,1H) t /*7 按订单ID,查询某订单所有路径*/ //新建自定义函数,用来查询订单(100w)的轨迹(8.6亿) def orderQuery(oid){ t=select code,btime,etime from loadTable("dfs://t_order",`order) where orderid=oid carcode = t.code[0] tt=select * from loadTable("dfs://dfs_drive",`drive) where code=carcode,ts between t.btime[0]:t.etime[0] return tt } //执行订单查询 timer t=orderQuery(1000006) t //添加存储过程(函数视图):执行后,可通过api调用此函数 try{ dropFunctionView(`orderQuery)}catch(x){ } addFunctionView(orderQuery)
/*8 以60倍速(每秒钟播放真实时间1分钟的轨迹数据)的速率,播放某订单的车辆行驶轨迹*/ rate=60 //回放倍速 t=orderQuery(1000006) //需要回放的数据 show=table(1:0,t.schema().colDefs.name,t.schema().colDefs.typeInt) submitJob("replay_drive","回放订单轨迹", replay, t,show, `ts, `ts, rate,false) //持续执行(可通过share函数将表共享,以输出到GIS系统的可视化地图) select * from show order by ts desc
|